#ifndef __MP_SESSION__
#define __MP_SESSION__

namespace xm
{
	typedef mp::rhdr_t	recp_t;
	typedef mp::phdr_t	ptnp_t;

	inline ptnp_t* get_phdr( LPCSTR pp )
	{
		return ((ptnp_t*)pp)-1;
	}
	inline le::U16* fmtp( recp_t * rp )
	{
		return (le::U16*)(rp + 1);
	}
	inline le::U16* fmtendp( recp_t * rp )
	{
		return fmtp(rp) + rp->nfmt + 1;
	}
	inline const char * namep( recp_t * rp )
	{
		return (const char *)fmtendp(rp);
	}
	inline const void * killdp( recp_t * rp )
	{
		return namep(rp) + rp->naml;
	}

	template <class T>
	struct zerov
	{
		T	val;
		inline zerov():val(0){}
		inline operator const T & () const { return val; }
		inline operator T & () { return val; }
		inline zerov& operator = ( const T v )
		{
			val = v;
			return *this;
		}
	};

	typedef zerov<int32_t>	zint32_t;

	struct p2r_t
	{
		LPCSTR		ptndp;
		recp_t*		rhptr;
	};

	struct mp_p2r_t : p2r_t
	{
		uint32_t	hash6b;
		LPCSTR		ptndp;
		recp_t*		rhptr;
		inline bool operator < ( const mp_p2r_t& right ) const
		{
			return hash6b < right.hash6b;
		}
	};

	typedef std::vector<p2r_t>	lgc_ptns_t;

	typedef struct rec_score_t
	{
		zint32_t	_score;
		zint32_t	_addcount;
	} rec_score_t, * rec_score_p;

	class XManEngine;

	struct xman_session_t : refable_impl_t
	{
		typedef std::map<recp_t*,rec_score_t>	score_vector_t;
		//////////////////////////////////////////////////////////////////////////
		iptr<IKDetectSession>	session;
		optr<XManEngine>		xman;
		//////////////////////////////////////////////////////////////////////////
		iptr<IKArchive>			archive;
		//////////////////////////////////////////////////////////////////////////
		FMTID					now_fmt;
		score_vector_t			score_of_recs;
		uint32_t				match_ctrl;
		//////////////////////////////////////////////////////////////////////////
		recp_t*					hit_rec;
		//////////////////////////////////////////////////////////////////////////
		// slot
		uint64_t				solts[256];
		//////////////////////////////////////////////////////////////////////////
		//
		iptr<IUnknown>			arch_tools;
		//////////////////////////////////////////////////////////////////////////
		//
		xman_session_t( XManEngine * engo, IKDetectSession * sess );

		inline recp_t * handle_pattern_hit( p2r_t& prmap );

		inline recp_t * handle_record_hit( recp_t * recp );

		inline void clear();

		inline recp_t * handle_hitted_mius_records();
	};
};

#endif